from aiogram.filters import StateFilter
from aiogram_sqlite_storage.sqlitestore import SQLStorage
from aiogram.filters.state import State, StatesGroup
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import default_state
from aiogram.types import FSInputFile
from telebot import types
from elmex_book import info, mem
from middleware import DbLogMiddleware
from aiogram.enums.parse_mode import ParseMode
from states import getstate
import os
import logging
import dotenv
import asyncio
from aiogram import Bot, Dispatcher, filters, types,F
from aiogram.utils.keyboard import ReplyKeyboardBuilder,InlineKeyboardBuilder
from keyboards import*
from aiogram.fsm.storage.redis import RedisStorage
product=''
#storage=RedisStorage.from_url()
my_storage = SQLStorage('messages.db', serializing_method = 'pickle')
dp = Dispatcher(storage=my_storage)
dp.message.middleware(DbLogMiddleware())
dotenv.load_dotenv()
TOKEN = os.getenv('TOKEN')
class Catalog(StatesGroup):
    main=State()
    nomen=State()
    klem=State()
@dp.message(F.text=='/start')
async def cmd_catalog(message: types.Message,state: FSMContext):
    await message.answer("Выберите действие⬇",reply_markup=form_without(info.keys()))
    await state.set_state(Catalog.main)
#@dp.message(F.text.in_(list(info.keys())))
@dp.message(filters.Command("secretinfo"))
async def ss(message: types.Message):
    hot=getstate("messages.db")
    await message.answer(f"<b>Пользователи</b>\nВсего:{hot[0]}\nСегодня:{hot[2]}\nНеделя:{hot[4]}\n"
                         f"<b>Сообщения</b>\nСегодня:{hot[1]}", parse_mode=ParseMode.HTML)
@dp.message(StateFilter(Catalog.main),F.text.in_(info.keys()))
async def book_info(message: types.Message,state: FSMContext):
    txt=message.text
    if txt == "Номенклатура":
        await state.set_state(Catalog.nomen)
        await message.answer("Выберите товар📦",reply_markup=form(mem.keys()))
    elif txt == "Технический вопрос":
        await message.answer("Перейдите в чат с технической поддержкой📲", reply_markup=inline_btn("Чат с поддержкой💻",info["Технический вопрос"]))
    elif txt =="ТГ канал":
        await message.answer("Перейдите в ТГ канал🔔 ", reply_markup=inline_btn("Перейти","https://t.me/Elmex_Russia"))
    elif txt in info.keys():
        send=info[txt]
        await message.answer(send)
@dp.message(StateFilter(Catalog.nomen),(F.text.in_("Назад")))
async def fjdk(message: types.Message,state: FSMContext):
    await message.answer("Выберите действие⬇",reply_markup=form_without(info.keys()))
    await state.set_state(Catalog.main)
@dp.message(StateFilter(Catalog.nomen))
async def jfj(message: types.Message,state: FSMContext):
    #global product#global обозначает переменную,которую можно изменить в хендлере
    frog=mem[message.text]
    await state.update_data(key=message.text)
    #if isinstance(frog,dict):#является ли переменная словарем
        #pass
    if 'photo' in frog and frog['url']:
        img = FSInputFile(f"{frog['photo']}.PNG")
        await message.answer_photo(img, caption=frog["Описание"],reply_markup=inline_btn('Скачать каталог',frog['url']))
    elif  'photo' in frog:
        img = FSInputFile(f"{frog['photo']}.PNG")
        await message.answer_photo(img, caption=frog["Описание"])
    else:
        
        await state.set_state(Catalog.klem)
        await message.answer("Выберите товар📦",reply_markup=form(frog.keys()))
@dp.message(StateFilter(Catalog.klem),(F.text.in_("Назад")))
async def regek(msg: types.Message,state: FSMContext):
     await state.set_state(Catalog.nomen)
     await msg.answer("Выберите товар📦",reply_markup=form(mem.keys()))
@dp.message(StateFilter(Catalog.klem))
async def id(msg: types.Message,state: FSMContext):
    tree=await state.get_data()
    afs=msg.text
    lol=mem[tree["key"]][afs]
    img = FSInputFile(f"{lol['photo']}.PNG")
    await msg.answer_photo(img, caption=lol["Описание"],reply_markup=inline_btn('Скачать каталог',lol['url']))
@dp.message()
async def df(message):
    await message.answer("Я вас не понимаю🙁.Попробуйте отправить /start")

async def main():
    bot = Bot(token=TOKEN) #  создание бота с токеном
    await bot.delete_webhook(drop_pending_updates=True)
    await dp.start_polling(bot) #диспетчер запускает бота
    
if __name__ == "__main__": # запускает файл,если не импортируется
    logging.basicConfig(level=logging.INFO) #информация о статусе бота
    asyncio.run(main()) #асинхронный запуск основной функции